package monster.comm.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.ServletContext;

import monster.flight.admin.manager.service.xtgl.DictService;
import monster.flight.admin.vo.xtgl.Dict_And_detailVO;

/**
 * 
* 创建信息=============
* 类名: monster.comm.util.DictManager
* 类作用描述: 数据字典的工厂类,单根设计模式，在服务器启动是在监听器里面启动，读取到application全局内存里面
* 创建人： jzk 
* 创建时间： 2013-1-8 下午05:35:40
* 修改信息1=============
* 修改类型:     //1.修改bug 2.业务变化修改
* 修改描述: 
* 修改人：  
* 修改时间：
 */
public class DictManager {
	
	private static HashMap<String,String> DictList=new HashMap<String,String>();//  保存所有的字典
	private static HashMap<String,String> dictIndexMap=new HashMap<String,String>();//保存数据字典的索引，主要为保存数据字典编码的对应


	private static DictManager service=null;
	private static String split="`";
	private DictManager() throws Exception{
		init();
	}
	public static synchronized DictManager  getInstance() throws Exception{
		if(service==null)
			service=new DictManager();
		return service;
	}
	

	/**
	 * 把所有数据字典都读取到内存里面去
	 * @throws Exception
	 */
	private  void init() throws Exception{
	   DictService dictService =(DictService)SpringApplicationContextFactory.getService("dictService");
	   List<Dict_And_detailVO> list = dictService.getDictAndDetail();
	   String dict_code_temp="";
	   for(int i=0;i<list.size();i++){
		   Dict_And_detailVO vo = list.get(i);
		   String dict_code=Tool.getValFromBean("dict_code", vo);
		   String dict_name=Tool.getValFromBean("dict_name", vo);
		   String option_id=Tool.getValFromBean("option_id", vo);
		   String option_name=Tool.getValFromBean("option_name", vo);
		   String dict_type=Tool.getValFromBean("dict_type", vo);
		   DictList.put(dict_code+split+option_id, option_name);	//数据字典ID`选项编码做索引
			
			
			if(!dict_code_temp.equals(dict_code)){
				dict_code_temp=dict_code;
				dictIndexMap.put(dict_code, dict_name+split+dict_type);//保存数据字典分类表,数据字典做索引
			}
	   }
		
	}
	
	/**
	 * 获得某一字典某一选项的显示值
	 * @param dict_code  数据字典编码
	 * @param option_code 数据字典选项编码,如果是多个，则用,隔开
	 * @return 显示值
	 */
	public String getDictValue(String dict_code,String option_code){
		String v="";
		if(dict_code==null  || dict_code.trim().length()==0){
			dict_code="";
		}
		if(option_code==null  || option_code.trim().length()==0){
			option_code="";
		}
		dict_code=dict_code.trim();
		option_code=option_code.trim();
		if("ZD_001".equals(dict_code) && "".equals(option_code)){//如果是是否，没有数据表示是否
			return "否";
		}
		if("".equals(dict_code) || "".equals(option_code)){
			return v;
		}
		if(option_code.indexOf(",")==-1){//只有存在一个
		   v=(String)DictList.get(dict_code+split+option_code);
		}
		else{//多个
			option_code=option_code.substring(1,option_code.length()-1);
			String sz[]=option_code.split(",");
			for(int i=0;i<sz.length;i++){
				String temp=(String)DictList.get(dict_code+split+sz[i]);
				if(temp==null)temp="";
				v+=temp+",";
			}
			if(v.trim().length()!=0)
				v=v.substring(0,v.length()-1);
		}
		if(v==null)
			v="";
		return v;
	}
	/**
	 * 获取数据字典名
	 * @param dict_code
	 * @return
	 */
	public String getDict_name(String dict_code){
		String ret="";
		ret=(String)dictIndexMap.get(dict_code);
		if(ret==null){
			return null;
		}
		String[] sz=ret.split(split);
		ret=sz[0];
		return ret;
	}
	
	/**
	 * 获取数据的类型
	 * @param dict_code
	 * @return
	 */
	public String getDict_type(String dict_code) throws Exception{
		String ret="";
		ret=(String)dictIndexMap.get(dict_code);
		if(ret==null)
			throw new Exception("没有找到对应的dict_code:"+dict_code);
		String[] sz=ret.split(split);
		ret=sz[1];
		return ret;
	}
	
	/**
	 * 把列表类型的数据字典初始化到ServletContext里面去
	 * @param app  application
	 * @throws Exception
	 */
   public  void initTblDict(ServletContext app)throws Exception{
	   
	   DictService dictService =(DictService)SpringApplicationContextFactory.getService("dictService");
	   List<Dict_And_detailVO> list = dictService.getDictAndDetail();	   
	   for(int i=0;i<list.size();i++){
		    Dict_And_detailVO vo  = list.get(i);
			String dict_code=Tool.getValFromBean("dict_code", vo);
			if(!dict_code.equals("")){
				if(app.getAttribute(dict_code)==null){
					ArrayList<Option> optionList=new  ArrayList<Option>();
					addDict(vo,optionList);			
					app.setAttribute(dict_code, optionList);
				}else{
					@SuppressWarnings("unchecked")
					ArrayList<Option> optionList = (ArrayList<Option>)app.getAttribute(dict_code);
					addDict(vo,optionList);
				}
			}
		}
	
   }
   
   private  void addDict(Dict_And_detailVO vo,List<Option> list) throws Exception{
	    Option  option=new Option(vo.getOption_name(),vo.getOption_id());
		list.add(option);
		
   }
   
   
   
   /**
    * 刷新保存在cache里面的数据字典，在保存数据字典时候需要调用此类重新读取数据
    * @param app
    * @throws Exception
    */
   public  void reshDict(ServletContext app) throws Exception{
	   init();
	   initTblDict(app);
   }

}
